import numpy as np
import sys,os
sys.path.append(os.pardir)
from common.functions import cross_entropy_error
def cross_entropy_error_1d(y,t):
    delta = 1e-7
    return -np.sum(t*np.log(y+delta))

# def cross_entropy_error(y,t):
#     if y.ndim == 1:
#         t = t.reshape(1,t.size)
#         y = y.reshape(1,y.size)
#     # 监督数据为one-hot-vector时，转换为正确的标签的索引
#     if t.size == y.size:
#         t = t.argmax(axis=1)

#     batch_size = y.shape[0]
#     # 获取神经网络输出中与监督数据（非one-hot)位置对应值
#     y_i_t = y[np.arange(batch_size),t]
#     return -np.sum(np.log(y_i_t+1e-7))/batch_size

# 神经网络输出：2的概率最高的情况（0.6）
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]

# 神经网络输出：7的概率最高的情况（0.6）
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]

# 监督数据：假设2为正确的解
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

error1 = cross_entropy_error_1d(np.array(y1),np.array(t))
print(error1)
error2 = cross_entropy_error_1d(np.array(y2),np.array(t))
print(error2)
y = np.array([[0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0],[0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]])
t = np.array([[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]])
error3 = cross_entropy_error(y,t)
print(error3)